package com.learn.Lock;

/**
 * Volatile 关键字三大特性
 * 1.线程可见
 * 2.非原子性
 * 3.避免指令重排
 *
 * JMM  Java内存模型
 * 1.不物理存在的空间,而是一批约定俗成的规则
 * 2.8大原子操作  lock  read  load  user assgin store write unlock
 *
 * 3.read load   和 store write 必须成对出现不能单一出现
 * 4.不允许assgin丢弃更新，工作内存值更新必须更新回主内存
 * 5.8大操作按照顺序执行
 * 4.一个变量值对其执行lock之后，工作内存的值会被更新，重新load新值到工作内存中
 * 5.一个变量、同一个时刻、只允许一条线程执行lock，但lock可被此线程多次执行，必须执行同次数的unlock才可以
 * 6.
 *
 */
public class VolatileDemo {
    public static volatile int num = 0;

    public static void main(String[] args) {
        //volatile可见性测试
        new Thread(()->{
            while (num==1){
                System.out.println("num==1");
                return;
            }
        },"A").start();
        //主线程的num变化会使A线程内的循环满足条件
        num=1;
        System.out.println("main");
    }
}
